package manage.view;

import manage.model.Student;
import manage.utils.SqliteDb;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;

/*
Java-Swing：java中开发GUI界面的工具包
界面分三层：顶层容器（JFrame）、中间层容器（JPanel）、组件
页面布局：东西南北中，如果没有，用“中”填充。
 */
public class MainView extends JFrame {
    JTextField searchText; // 跨方法访问时，定义成属性。
    static JTable jTable;

    /*
    页面的绘制放到构造方法中。
    1. 展示增删改查的按钮。
    2. 展示所有学生信息，放到一个表格中
     */
    public MainView() {
        // JPanel 加到JFrame上
        add(north(), BorderLayout.NORTH);
        add(center(), BorderLayout.CENTER);
        // 设置窗口标题
        setTitle("学生管理系统");
        // x、y 相对于屏幕左上角的位置计算的，屏幕左上角是0,0位置
        setBounds(200, 100, 800, 600);
        // 设置页面窗口关闭按钮如何响应。
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        // 设置窗口可见。
        setVisible(true);
    }

    // 北边：增删改查按钮
    private JPanel north() {
        JPanel n = new JPanel();

        JButton addButton = new JButton("添加学生");
        addButton.addActionListener(new AddAction());
        n.add(addButton);

        JButton modifyButton = new JButton("修改学生");
        modifyButton.addActionListener(new ModifyAction());
        n.add(modifyButton);

        JButton deleteButton = new JButton("删除学生");
        deleteButton.addActionListener(new DeleteAction());
        n.add(deleteButton);

        // 输入查询内容的框
        searchText = new JTextField();
        n.add(searchText);

        JButton searchButton = new JButton("查找");
        searchButton.addActionListener(new SearchAction()); // 添加监听的事件
        n.add(searchButton);

        // 组件的布局。GridLayout 是网格布局管理器，
        // 将上面的5个组件放到1行5列，在范围内平均分布。
        GridLayout gridLayout = new GridLayout(1, 5);
        n.setLayout(gridLayout);

        return n;
    }

    // 中间：学生的表格
    private JPanel center() {
        JPanel c = new JPanel();

        // 表格
        jTable = new JTable();
        // 单元格的属性
        DefaultTableCellRenderer cr = new DefaultTableCellRenderer();
        // 单元格中数据的对齐方式：居中对齐
        cr.setHorizontalAlignment(JLabel.CENTER);
        // 设置表格的单元格属性
        jTable.setDefaultRenderer(Object.class, cr);

        // 填充数据
        refreshTable(jTable, SqliteDb.queryStudent());

        // 滚动面板，把表格放到滚动面板中，自动增加横向、竖向的滚动条。
        JScrollPane jScrollPane = new JScrollPane(jTable);
        c.add(jScrollPane);

        // 设置表格的布局
        GridLayout gridLayout = new GridLayout(1, 1);
        c.setLayout(gridLayout);

        return c;
    }

    /*
    把学生填充到表格中
    首次打开页面时，添加学生后，删除学生后，查找学生后都会用到。
    java.util.List
    java.swt.List  类名一样，包不同，使用时有冲突，可以把包名带上
     */
    public static void refreshTable(JTable jTable, java.util.List<Student> students) {
        // 表格的数据使用TableModel类来管理，获取这个表格的TableModel
        TableModel tm = jTable.getModel();
        // TableModel 是接口，它的对象不能直接调用成员方法。
        // 强转成TableModel的实现类
        DefaultTableModel dtm = (DefaultTableModel) tm;
        String[] names = {"编号", "姓名", "性别", "年龄", "班级", "学分", "联系方式"};
        // students.size() 有多少个学生，7 每个学生有多少属性
        String[][] stus = new String[students.size()][7];

        for (int i = 0; i < students.size(); i++) {
            // 从列表中取一个学生
            Student s1 = students.get(i);
            stus[i][0] = String.valueOf(s1.getId());
            stus[i][1] = s1.getName();
            stus[i][2] = s1.getGender();
            stus[i][3] = s1.getAge();
            stus[i][4] = s1.getClasses();
            stus[i][5] = s1.getScore();
            stus[i][6] = s1.getPhone();
        }

        dtm.setDataVector(stus, names);

    }


    /*
    查询按钮的功能
     */
    public class SearchAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("点击了搜索按钮");
            // 获取输入的字符串
            String key = searchText.getText();
            java.util.List<Student> students;
            if (key == null || key.equals("")) { // 全量搜索
                students = SqliteDb.queryStudent();
            } else { // 根据key搜索
                students = SqliteDb.queryStudent(key);
            }
            // 刷新表格（将jTable 从局部变量提升为属性）
            refreshTable(jTable, students);
        }
    }


    public static class AddAction implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("点击了添加按钮");
            // 打开添加学生的页面
            new AddView();
        }
    }

    public static class ModifyAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("点击了修改按钮");

            // 获取选中行
            int row = jTable.getSelectedRow();
            // 获取改行学生信息
            String id = (String) jTable.getValueAt(row, 0);
            String name = (String) jTable.getValueAt(row, 1);
            String gender = (String) jTable.getValueAt(row, 2);
            String age = (String) jTable.getValueAt(row, 3);
            String classes = (String) jTable.getValueAt(row, 4);
            String score = (String) jTable.getValueAt(row, 5);
            String phone = (String) jTable.getValueAt(row, 6);
            // 创建学生
            Student student = new Student(Integer.parseInt(id), name, age, gender,
                    classes, phone, score);
            System.out.println("要修改的学生信息为：" + student);
            // ModifyView 构造方法增加一个Student类型参数
            new ModifyView(student);
        }
    }

    public static class DeleteAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("点击了删除按钮");
            // 获取选中行
            int[] rows = jTable.getSelectedRows();
            // 创建一个数组存放id
            int[] ids = new int[rows.length];
            for (int i = 0; i < rows.length; i++) {
                // 第i行第0列的值
                String id = (String) jTable.getValueAt(rows[i], 0);
                ids[i] = Integer.parseInt(id);
            }
            System.out.println("要删除的学生id为：" + Arrays.toString(ids));

            // 删除前二次确认，避免误操作。
            int msg = JOptionPane.showConfirmDialog(null,
                    "请确认是否删除id为" + Arrays.toString(ids) + "的学生？",
                    "删除确认",
                    JOptionPane.YES_NO_OPTION);
            System.out.println("用户选择的按钮为：" + msg);
            if (msg == 0) {
                for (int id : ids) {
                    SqliteDb.deleteStudent(id);
                }
            }
            // 全部删除完成后，刷新下表格
            refreshTable(jTable, SqliteDb.queryStudent());
            JOptionPane.showMessageDialog(null, "删除完成。");
        }
    }
}
